// public private 和 protected§
// TypeScript 可以使用三种访问修饰符（Access Modifiers），分别是 public、private 和 protected。
// public    修饰的属性或方法是公有的，可以在任何地方被访问到，默认所有的属性和方法都是 public 的
// private   修饰的属性或方法是私有的，不能在声明它的类的外部访问
// protected 修饰的属性或方法是受保护的，它和 private 类似，区别是它在子类中也是允许被访问的


/* class Animal {
    public name:string;
    public age:number;
    public species:string = "animal";
    public constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    static msg = "你好";
    static isAni(arg) {
        return arg.constructor == Animal;
    }

    public say() {
        console.log(this.name, this.age);
    }
}

var tom = new Animal("Tom", 2);
console.log(tom.name);
console.log(tom.age);
console.log(tom.species);
tom.say()
 */



// private

// 私有属性 和 方法   => 只能在构造函数内部访问,函数外部无法访问,子类没有办法继承
// 使用 private 修饰的属性或方法，在子类中也是不允许访问的：


/* class Animal {
    public name;

    // 私有属性  => 只能在构造函数内部访问
    private age:number;
    private species:string = "animal";
   
    public constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    private say() {
        console.log(this.name, this.age);
    }
}

var tom = new Animal("Tom", 2);
console.log(tom.name);
console.log(tom.age);  // 报错  属性“age”为私有属性，只能在类“Animal”中访问
console.log(tom.species);
tom.say() */


// 当构造函数修饰为 private 时，该类不允许被继承或者实例化：
/* class Animal {
    public name: string;

    // 私有属性  => 只能在构造函数内部访问
    private age: number;
    private species: string = "animal";
    private constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    private say() {
        console.log(this.name, this.age);
    }
}

// var tom = new Animal("Tom", 2);  // 报错
// console.log(tom.name);
// console.log(tom.age);  // 报错  属性“age”为私有属性，只能在类“Animal”中访问
// console.log(tom.species);
// tom.say() */


// protected  
// 1. protected  修饰的属性或方法是受保护的，它和 private 类似，区别是它在子类中也是允许被访问的
// 2. 子类可以继承 (只有 在子类中也是允许被访问的)
// 3. 当构造函数修饰为 protected 时，该类只允许被继承：

class Animal {
    protected name: string;

    // 私有属性  => 只能在构造函数内部访问
    protected age: number;
    protected species: string = "animal";
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    protected say() {
        console.log(this.name, this.age);
    }
}
// var tom = new Animal("Tom", 2);  
// console.log(tom.name);
// console.log(tom.age);  // 报错  属性“age”为私有属性，只能在类“Animal”中访问
// console.log(tom.species);
// tom.say() * /



class Dog extends Animal {
    sayDog() {
        console.log(this.name, this.age);
    }
}

var wangCai = new Dog("旺财", 2);

wangCai.sayDog();




export default 100;